package com.yunyike.app.data.controller;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import com.rop.response.Response;
import com.yunyike.app.constants.CommonConstant;
import com.yunyike.app.constants.OrderConstants;
import com.yunyike.app.data.dto.UserOrdersDTO;
import com.yunyike.app.data.model.OrderReceiptMapping;
import com.yunyike.app.data.model.User;
import com.yunyike.app.data.service.IOrderReceiptMappingService;
import com.yunyike.app.data.service.IOrderService;
import com.yunyike.app.redis.JedisManager;
import com.yunyike.app.util.CopUtils;

@Controller
@RequestMapping(value = "/upload")
public class UploadImgController {

	private Logger log = LoggerFactory.getLogger(UploadImgController.class);

	@Autowired
	private IOrderService orderService;
	@Autowired
	private IOrderReceiptMappingService iOrderReceiptMappingService;

	@RequestMapping("/img")
	@ResponseBody
	public Response handleFormUpload(HttpServletRequest request, String shopperId, String sign, String orderId,
			String receiptNumber) {
		log.info("handleFormUpload==================");
		log.info("=======params=" + receiptNumber + "," + shopperId + "," + orderId + "," + sign + "," + request);
		Response response = new Response();
		// 判断签名是否异常
		Map<String, String> paramValues = new HashMap<String, String>();
		paramValues.put("shopperId", shopperId);
		paramValues.put("orderId", orderId);
		paramValues.put("receiptNumber", receiptNumber);
		paramValues.put("appKey", CommonConstant.APP_KEY);
		// 生成签名--根据后台约定，并非每个参数都需要计算签名
		String temp = CopUtils.sign(paramValues, CommonConstant.APP_SECRET);
		log.info("tempsign::::::" + temp);
		// if (!temp.equals(sign)) {
		// log.info("签名异常");
		// response.getResult().setMessage("签名异常");
		// response.getResult().setResult("0");
		// return response;
		// }

		User user = JedisManager.getObject(shopperId + CommonConstant.SHOPPER_CONNECT_USER, User.class);
		if (null == user) {
			log.info("user::::未获取到该导购的绑定用户shopperId=" + shopperId);
			response.getResult().setResult("0");
			response.getResult().setMessage("未获取到关联顾客!");
			return response;
		}
		log.info("user::::::" + user.getUserName() + "||" + user.getUserId());

		UserOrdersDTO dto = new UserOrdersDTO();
		dto.setUserId(user.getUserId());
		dto.setOrderId(orderId);
		dto.setOrderStatus(OrderConstants.ORDER_STATUS_0);
		List<UserOrdersDTO> orders = orderService.findUserOrders(dto);
		if (null == orders || orders.size() == 0) {
			log.info("order::::未获取到待支付订单orderId=" + orderId);
			response.getResult().setResult("0");
			response.getResult().setMessage("该订单不存在或已确认支付");
			return response;
		}
		String uploadTime = "";
		try {
			// 上传图片
			MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;

			List<MultipartFile> files = multipartRequest.getFiles("file");
			List<OrderReceiptMapping> receipts = new ArrayList<OrderReceiptMapping>();
			Map<String, String> imgs = new HashMap<String, String>();
			for (int i = 0; i < files.size(); i++) {
				String webpath = saveWebImgFile(files.get(i));
				if (!"".equals(webpath)) {
					OrderReceiptMapping receiptImg = new OrderReceiptMapping();
					receiptImg.setReceiptImg(webpath);
					receiptImg.setOrderId(orderId);
					receiptImg.setReceiptNumber(receiptNumber);
					receiptImg.setReceiptImgDate(new Date());
					receipts.add(receiptImg);
				}
				imgs.put("img" + i, webpath);
			}
			if (receipts.size() > 0) {
//				int records = iOrderReceiptMappingService.insert(receipts);
				response.setData(imgs);
				response.getResult().setMessage("success");
				response.getResult().setResult("0");
			} else {
				response.getResult().setMessage("error");
				response.getResult().setResult("1");
			}
		} catch (Exception e) {
			e.printStackTrace();
			response.getResult().setMessage("error" + e.toString());
			response.getResult().setResult("1");
		}

		return response;
	}

	public String saveWebImgFile(MultipartFile imgFile) {
		log.info("uploadImg：：：begin----");
		String webFilePath = "";
		if (imgFile.getSize() > 0 && isImage(imgFile.getContentType())) {
			FileOutputStream fos = null;
			try {
				byte[] b = imgFile.getBytes();
				/* 构造文件路径 */
				String webRoot = "C:/Users/sq/git/yunyike-app-web/yunyike-app-web/src/main/webapp";// PathUtil.classPath();
				SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
				SimpleDateFormat sdf2 = new SimpleDateFormat("HHmmssSSS");
				String datePath = sdf.format(new Date());
				String datePath2 = sdf2.format(new Date());
				String dirPath = webRoot + "/upload/img/" + datePath;
				File dir = new File(dirPath);
				if (!dir.exists()) {
					dir.mkdirs();
				}
				String fileName = imgFile.getOriginalFilename();
				String filePath = dirPath + "/" + datePath2 + getImgSuffix(fileName);
				webFilePath = "/upload/img/" + datePath + "/" + datePath2 + getImgSuffix(fileName);
				File file = new File(filePath);

				dir.setWritable(true);
				file.setWritable(true);

				fos = new FileOutputStream(file);
				fos.write(b);

			} catch (IOException e) {
				throw new RuntimeException("文件上传失败！", e);
			} finally {
				if (fos != null) {
					try {
						fos.close();
					} catch (IOException e) {
						throw new RuntimeException("文件上传->输出流关闭失败！！！！", e);
					}
				}
			}

		}
		log.info("uploadImg：：：end----ImgPath：" + webFilePath);
		return webFilePath;
	}

	private String getImgSuffix(String fileName) {
		return fileName;
	}

	private boolean isImage(String contentType) {
		return true;
	}

	
	public static void test(HttpServletRequest request, HttpServletResponse response) {
	        try{  
	        final long MAX_SIZE = 3 * 1024 * 1024;// 设置上传文件最大为 3M  
	        // 允许上传的文件格式的列表  
	        final String[] allowedExt = new String[] { "jpg", "jpeg", "gif", "txt",  
	                "doc", "docx", "mp3", "wma", "m4a" };  
	        response.setContentType("text/html");  
	        // 设置字符编码为UTF-8, 这样支持汉字显示  
	        response.setCharacterEncoding("UTF-8");  
	        // 实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload  
	        DiskFileItemFactory dfif = new DiskFileItemFactory();  
	        dfif.setSizeThreshold(4096);// 设置上传文件时用于临时存放文件的内存大小,这里是4K.多于的部分将临时存在硬盘  
	        dfif.setRepository(new File(request.getRealPath("/")  
	                + "imgs"));// 设置存放临时文件的目录,web根目录下的imgs目录  
	        // 用以上工厂实例化上传组件  
	        ServletFileUpload sfu = new ServletFileUpload(dfif);  
	        // 设置最大上传尺寸  
	        sfu.setSizeMax(MAX_SIZE);  
	        PrintWriter out = response.getWriter();  
	        // 从request得到 所有 上传域的列表  
	        List fileList = null;  
	        try {  
	            fileList = sfu.parseRequest(request);  
	        } catch (FileUploadException e) {// 处理文件尺寸过大异常  
	            if (e instanceof SizeLimitExceededException) {  
	                out.println("文件尺寸超过规定大小:" + MAX_SIZE + "字节<p />");  
	                return;  
	            }  
	            e.printStackTrace();  
	        }  
	        // 没有文件上传  
	        if (fileList == null || fileList.size() == 0) {  
	            out.println("请选择上传文件<p />");  
	            return;  
	        }  
	        // 得到所有上传的文件  
	        Iterator fileItr = fileList.iterator();  
	        // 循环处理所有文件  
	        while (fileItr.hasNext()) {  
	            FileItem fileItem = null;  
	            String path = null;  
	            long size = 0;  
	            // 得到当前文件  
	            fileItem = (FileItem) fileItr.next();  
	            // 忽略简单form字段而不是上传域的文件域(<input type="text" />等)  
	            if (fileItem == null || fileItem.isFormField()) {  
	                continue;  
	            }  
	            // 得到文件的完整路径  
	            path = fileItem.getName();  
	            // 得到文件的大小  
	            size = fileItem.getSize();  
	            if ("".equals(path) || size == 0) {  
	                out.println("请选择上传文件<p />");  
	                return;  
	            }  
	            // 得到去除路径的文件名  
	            String t_name = path.substring(path.lastIndexOf("//") + 1);  
	            // 得到文件的扩展名(无扩展名时将得到全名)  
	            String t_ext = t_name.substring(t_name.lastIndexOf(".") + 1);  
	            // 拒绝接受规定文件格式之外的文件类型  
	            int allowFlag = 0;  
	            int allowedExtCount = allowedExt.length;  
	            for (; allowFlag < allowedExtCount; allowFlag++) {  
	                if (allowedExt[allowFlag].equals(t_ext))  
	                    break;  
	            }  
	            if (allowFlag == allowedExtCount) {  
	                out.println("请上传以下类型的文件<p />");  
	                for (allowFlag = 0; allowFlag < allowedExtCount; allowFlag++)  
	                    out.println("*." + allowedExt[allowFlag]  
	                            + "   ");  
	                return;  
	            }  
	            long now = System.currentTimeMillis();  
	            // 根据系统时间生成上传后保存的文件名  
	            String prefix = String.valueOf(now);  
	            // 保存的最终文件完整路径,保存在web根目录下的ImagesUploaded目录下  
	            String u_name = request.getRealPath("/") + "imgs/"  
	                    + prefix + "." + t_ext;  
	            try {  
	                File file = new File(u_name);  
//	              if(!file.exists()){  
//	                  System.out.print(file.mkdirs());  
//	                  System.out.print(file.mkdir());  
//	              }  
	                // 保存文件  
	                fileItem.write(file);  
	                out.println("文件上传成功. 已保存为: " + prefix + "." + t_ext  
	                        + "   文件大小: " + size + "字节<p />");  
	            } catch (Exception e) {  
	                e.printStackTrace();  
	            }  
	        }  
	        }catch(Exception e){  
	            e.printStackTrace();  
	        }  
	}
	
	


}
